package net.oschina.jms.queue;

import org.apache.activemq.ActiveMQConnectionFactory;

import javax.jms.*;

/**
 * @Author: AiBinXiao
 * @Description: 队列模式：消费者，从消息中间件接收消息的
 * @Date: 2017/11/1 10:59
 */

public class AppConsumer {
    private static final String url = "tcp://127.0.0.1:61616"; // 端口61616是activemq默认的端口
    private static final String queueName = "queue-test"; // 创建队列的名字

    public static void main(String[] args) throws JMSException {
        // 1.创建ConnectionFactory
        ConnectionFactory connectionFactory = new ActiveMQConnectionFactory(url);

        // 2.创建Connection
        Connection connection = connectionFactory.createConnection();

        // 3.启动连接
        connection.start();

        // 4.创建会话
        // 参数1，是否在事务中处理，参数2，使用的应答模式，使用自动应答
        Session session = connection.createSession(false, Session.AUTO_ACKNOWLEDGE);

        // 5.创建一个目标
        Destination destination = session.createQueue(queueName);

        // 6.创建一个消费者者，并从目标接收消息
        MessageConsumer consumer = session.createConsumer(destination);

        // 7.创建一个监听器，
        consumer.setMessageListener(new MessageListener() {
            public void onMessage(Message message) {
                try {
                    TextMessage textMessage = (TextMessage) message;
                    System.out.println("接收消息：" + textMessage.getText());
                } catch (JMSException e) {
                    e.printStackTrace();
                }
            }
        });
        // 8.关闭连接，不然会导致连接被耗尽的情况，就无法链接到ActiveMQ了
        // 消息监听是一个异步过程，所以它还没有接收到消息时，连接却已经关闭了，所以需要先注释掉，需要让消息接收完才能关闭连接
        // 监听者启动后，程序是一直为启动状态，它的线程是阻塞状态的，如果这个时候关闭连接，程序就会直接关闭
        // connection.close();
        // 注意：当有两个消费者的情况下，会均分消息队列中的消息，一个得到奇数消息，一个得到偶数消息
    }
}
